#include <QtWidgets>
#include <QDebug>

#include "client.h"

Client::Client(QWidget *parent) :
    QDialog(parent)
{
    hostLabel = new QLabel(tr("&Server name: "));
    hostLineEdit = new QLineEdit(tr("fortune"));
    hostLabel->setBuddy(hostLineEdit);

    statusLabel = new QLabel(tr("This examples requires that you also run the "
                                "Fortune server example as well."));

    statusLabel->setWordWrap(true);

    getFortuneButton = new QPushButton(tr("Get Fortune"));
    getFortuneButton->setDefault(true);

    quitButton = new QPushButton(tr("Quit"));

    buttonBox = new QDialogButtonBox;
    buttonBox->addButton(getFortuneButton, QDialogButtonBox::ActionRole);
    buttonBox->addButton(quitButton, QDialogButtonBox::RejectRole);

    socket = new QLocalSocket(this);
    connect(hostLineEdit,SIGNAL(textChanged(QString)),this,SLOT(enableGetFortuneButton()));
    connect(quitButton,SIGNAL(clicked()),this,SLOT(close()));
    connect(getFortuneButton,SIGNAL(clicked()),SLOT(requestFortune()));
    connect(socket,SIGNAL(readyRead()),this,SLOT(readFortune()));
    connect(socket,SIGNAL(error(QLocalSocket::LocalSocketError)),this,SLOT(displayErr(QLocalSocket::LocalSocketError)));

    QGridLayout *mainLayout = new QGridLayout;
    mainLayout->addWidget(hostLabel, 0,0);
    mainLayout->addWidget(hostLineEdit, 0,1);
    mainLayout->addWidget(statusLabel, 2,0, 1, 2);
    mainLayout->addWidget(buttonBox, 3,0,1,2);
    setLayout(mainLayout);

    setWindowTitle(tr("Fortune Client"));
    hostLineEdit->setFocus();
}

void Client::requestFortune()
{
    qDebug("requestFortune.");

    getFortuneButton->setDisabled(true);
    blockSize = 0;
    socket->abort();
    socket->connectToServer(hostLineEdit->text());
}

void Client::readFortune()
{
    qDebug("readFortune.");

    QDataStream in(socket);
    in.setVersion(QDataStream::Qt_4_0);

    if (blockSize == 0)
    {
        if (socket->bytesAvailable() < (int)sizeof(quint16))
            return;
        in >> blockSize;
    }

    if (in.atEnd())
        return;

    QString nextFortune;
    in >> nextFortune;

    //qDebug(nextFortune);

    if (nextFortune == currentFortune)
    {
        QTimer::singleShot(0, this, SLOT(requestFortune()));
        return;
    }

    currentFortune = nextFortune;
    //statusLabel->setText(currentFortune);
    //qDebug(currentFortune);
    qDebug() << currentFortune;

    getFortuneButton->setEnabled(true);

}

void Client::displayErr(QLocalSocket::LocalSocketError error)
{
    qDebug("displayErr.");

    switch (error) {
    case QLocalSocket::ServerNotFoundError:
        QMessageBox::information(this,tr("Fortune Client")
                                 ,tr("The host was not found. "
                                     "Please check the host name settings."));
        break;

    case QLocalSocket::ConnectionRefusedError:
        QMessageBox::information(this,tr("Fortune Client"),
                                 tr("The connect was refused by the peer. "
                                    "Make sure the fortune server is running. "
                                    "and check that the host name and post settings "
                                    "are correct"));
        break;

    case QLocalSocket::PeerClosedError:
        break;
    default:
        QMessageBox::information(this,tr("Fortune Client"),
                                 tr("The follow error occured: %1")
                                 .arg(socket->errorString()));
    }

    getFortuneButton->setEnabled(true);
}

void Client::enableGetFortuneButton()
{
    qDebug("enableGetFortuneButton.");

    getFortuneButton->setEnabled(!hostLineEdit->text().isEmpty());
}


